<?
class WebService extends Root{
	public function __construct($t) {}

 	public function __call($method,$arguments) {
		//Analyse du lien
		$Lien = $GLOBALS["Systeme"]->Lien;
		$temp = explode("/",$Lien);
		$Module = $temp[0];
		$GLOBALS["Systeme"]->Log->log("SOAP $method $arguments ");
		//Renvoie les details de la requete 
		switch ($method) {
			case "Ajouter":
			break;
			case "Supprimer":
			break;
			case "MajCompte":
				return $this->MajCompte($arguments);
			break;
			case "GetFile":
				return $this->GetFile($arguments);
			break;
			case "GetPack":
				return $this->GetPack($arguments);
			break;
			case "GetClient":
				return $this->GetClient($arguments);
			break;
			case "Synchro":
				return $this->AddProdMethod($arguments,$Module);
			break;
			case "AddProd":
				return $this->AddProdMethod($arguments,$Module);
			break;
			case "GetClient":
				return $this->GetClient($arguments);
			break;
			default:
				return  "<h1>natom.kob-eye.com ERROR $method </h1>";
			break;
		}
 	}	



	function AddObj($tempO,$Module,$parent=0,$ocParent="",$Niv=0){
		$Pref="";
		for ($i=0;$i<$Niv;$i++){
			$Pref .="------"; 
		}
		//Detection del objectclass
		if (is_array($tempO))foreach ($tempO as $k=>$t) {
			$temp = $t;
			$ObjClass = $k;
			if (is_array($temp))foreach ($temp as $C){
				//Recherche de l existance de la rubrique
				$Search = $Module."/".$ObjClass."/RmId=".$C["#"]["Id"][0]["#"];
	// 			$result = print_r($Search,true);
				$Tab = $GLOBALS["Systeme"]->Modules[$Module]->callData($Search,"",0,1);
	// 			$result = print_r($Tab,true);
				if (is_array($Tab)&&sizeof($Tab)>0){
					//On le modifie
					$result .= $Pref."ON MODIFIE ".$C["#"]["Id"][0]["#"]."\r\n";
					$Obj = genericClass::createInstance($Module,$Tab[0]);
				}else{
					//On le cree
					$result .= $Pref."ON CREE ".$C["#"]["Id"][0]["#"]."\r\n";
					$Obj = genericClass::createInstance($Module,$ObjClass);
					$Obj->Set("RmId",$C["#"]["Id"][0]["#"]);
					$Obj->resetParents($ocParent);
				}
				if ($parent!=0&&$ocParent!=""){
					$result .= $Pref."-------->DEFAULT PARENT $ocParent -> ".$parent."\r\n";
					//Recherche de l id local du parent
					$Search = $Module."/".$ocParent."/RmId=".$parent;
					$Tab2 = $GLOBALS["Systeme"]->Modules[$Module]->callData($Search,"",0,1);
					if (is_array($Tab2)&&sizeof($Tab2)>0){
						$Obj->AddParent($Module."/".$ocParent."/".$Tab2[0]["Id"]);
						$result.=$Pref."-----------> OK ".$Tab2[0]["Id"]."\r\n";
					}else{
						$result.=$Pref."----------->ERREUR PARENT ".$parent." NON TROUVE REQUETE ".$Search."\r\n";
					}
				}
				$Obj->Save();
				if (is_array($C["#"]))foreach ($C["#"] as $P=>$D) {
					if ($P=="Id"){
						$Obj->Set("IdRm",urldecode(($D[0]["#"])));
						$result .= $Pref."----->RMID $P -> ".$D[0]["#"]."\r\n";
					}elseif ($Obj->isProperty($P)) {
						$Pr = $Obj->getProperty($P);
						if ($Pr["Type"]=="file"){
							//Type fichier
							switch ($D[0]["@"]["format"]){
								case "base64":
									//Methode encod�e en base 64
									//Nom du fichier
									$NF = urldecode($D[0]["@"]["Nom"]);
									//Type mime
									$TF = urldecode($D[0]["@"]["Mime"]);
									//Decodage du fichier 
									$Data = base64_decode($D[0]["#"]);
									//Enregistrement et nommage
									$Fi = genericClass::createInstance("Explorateur","Fichier");
									$Fi->Set("Nom",$NF);
									$Fi->Set("Contenu",$Data);
									$Fi->Set("Type",$TF);
									$Fi->Set("Url","/Home/".$GLOBALS["Systeme"]->User->Id."/Boutique/Produit");
									$Fi->Save();
									//Enregistrement dans l objet
									$Obj->Set($P,$Fi->Url);
								break;
							}
						}else{
							$Obj->Set($P,urldecode($D[0]["#"]));
						}	
						$result .= $Pref."----->PROP $P -> ".$Obj->$P."\r\n";
					}elseif ($Obj->isChild($P)){
						//Enfants
						$result .= $Pref."----->CHILD $P -> ".$D[0]["#"]."\r\n";
						$z[$P] = $D;
						$result.=$this->AddObj($z,$Module,$C["#"]["Id"][0]["#"],$ObjClass,$Niv+1);
					}elseif ($Obj->isParent($P)&&$D[0]["@"]["link"]=="parent"){
						//Parents
						$result .= $Pref."----->PARENT $P -> ".$D[0]["#"]."\r\n";
						$Obj->resetParents($P);
						if (is_array($D))foreach ($D as $Pa){
							$result .= $Pref."-------->PARENT $P -> ".$Pa["#"]["Id"]["0"]["#"]."\r\n";
							//Recherche de l id local du parent
							$Search = $Module."/".$P."/RmId=".$Pa["#"]["Id"]["0"]["#"];
							$Tab2 = $GLOBALS["Systeme"]->Modules[$Module]->callData($Search,"",0,1);
							if (is_array($Tab2)&&sizeof($Tab2)>0){
								$Obj->AddParent($Module."/".$P."/".$Tab2[0]["Id"]);
								$result.=$Pref."-----------> OK ".$Tab2[0]["Id"]."\r\n";
							}else{
								$result.=$Pref."----------->ERREUR PARENT ".$Pa["#"]["Id"]["0"]["#"]." NON TROUVE\r\n";
							}
						}
					}else{
						$result .= $Pref."----->ERROR NON GERe |$P| ".$Obj->isProperty($P)." \r\n";
					}
				}
				if ($Obj->Verify()){
					$Obj->Save();
					$result.=$Pref." EDIT ID ".$Obj->Id;
				}else $result.=$Pref."ERREUR ".$Obj->Verify();
				$result.="\r\n";
			}else{
				$result=$Pref."ERREUR CE N EST PAS UN TABLEAU TEMP".$temp;
			}
		}else{
			$result=$Pref."ERREUR CE N EST PAS UN TABLEAU TEMPO  ".$temp0;
		}
		return $result;
	}

	function AddProdMethod($a,$Module){
		//On recoit un document xml avec la liste des elements a mettre a jour ou a creer
		$temp = $a[0];
		//On le transforme en tableau
		$x = new xml2array(utf8_encode($temp));
		$temp = $x->getResult();
		$temp = $temp["Xml"]["#"];
// 		$result =utf8_decode("TEST");
		$GLOBALS["Systeme"]->Modules[$Module]->loadSchema();
		//$result = print_r($temp,true);
		$result = $this->AddObj($temp,$Module);
		//Mise ajour de la base de donnee
		$GLOBALS["Systeme"]->Modules[$Module]->Db->Check();
		return $result;
	}

	//**************************************************************//
	//			METHODE NATOM				//
	//**************************************************************//
	//MAJCOMPTE
	//Mise a jour du compte pour le logiciel
	//$A est le NUMERO DE SERIE
	//$B est la version du logiciel
	function MajCompte($A,$B){
// 		$result = print_r($_SERVER,true);
		//Recherche du client.
		if (!$A) return "ERREUR VEUILLEZ FOURNIR UN NUMERO DE SERIE VALIDE";
		$GLOBALS["Systeme"]->Modules["Boutique"]->loadSchema();
		$Search = "Boutique/Client/NatomSerie=".$A;
		$Tab = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($Search,"",0,1);
// 		$result = print_r($Tab,true);
		if (is_array($Tab)){
			//Le numero de serie est valide , on met donc la version a jour
			$Obj = genericClass::createInstance("Boutique",$Tab[0]);
			$Obj->Set("Version",$B);
			$Obj->Save();
			// Constrcution du Xml avec les fichiers
			$ProdSearch = "Boutique/Client/".$Tab[0]["Id"]."/Produit";
			$Prod = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($ProdSearch);
			$result="<xml>";
			if (is_array($Prod))foreach ($Prod as $P){
				if ($P["Type"]=="Pack"){
					//On recupere le nombre de fichier contenu dans le pack
					$PackSearch = "Boutique/Produit/".$P["Id"]."/Pack";
					$Pack = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($PackSearch);
					//Nom du fichier
					$p = explode("/",$Pack[0]["FichierXmn"]);
// 					return print_r($P,true);
					$fn = $p[sizeof($p)-1];
					$n = preg_replace("#(\-[0-9]+)\.#",".",$fn);
					$n = preg_replace("#\_#","-",$n);
					//On calcule le nombre de fichier a recuperer
					$ProdsSearch = "Boutique/Pack/".$Pack[0]["Id"]."/Produit";
					$Prods = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($ProdsSearch);
					$result.="
	<item id='".$P["Id"]."' type='2' crc=''>
	</item>";
				}else{
					//Calcul du checksum
					$file_string = file_get_contents($P["ImageCrypt"]);
					$crc = crc32($file_string);
					//Nom du fichier
					$p = explode("/",$P["ImageCrypt"]);
// 					return print_r($P,true);
					$fn = $p[sizeof($p)-1];
					$n = preg_replace("#(\-[0-9]+)\.#",".",$fn);
					$n = preg_replace("#\_#","-",$n);
					$result.="
	<item id='".$P["Id"]."' type='1' crc='".sprintf("%x",$crc)."'>
		<libelle>".$P["Libelle"]."</libelle>
		<file>".$n."</file>
		<path>".DEST_PATH_PLANCHE."</path>
	</item>";
					//Calcul du checksum
					$file_string = file_get_contents($P["ImageCryptLegende"]);
					$crc = crc32($file_string);
					//Nom du fichier
					$p = explode("/",$P["ImageCryptLegende"]);
					$fn = $p[sizeof($p)-1];
					$n = preg_replace("#(\-[0-9]+)\.#",".",$fn);
					$n = preg_replace("#\_#","-",$n);
					$result.="
	<item id='".$P["Id"]."-L' type='1' crc='".sprintf("%x",$crc)."'>
		<libelle>".$P["Libelle"]."</libelle>
		<file>".$n."</file>
		<path>".DEST_PATH_PLANCHE."</path>
	</item>";	
				}
			}
			//Insertion des fichiers de mise a jour
			$ProdSearch = "Boutique/Natom/Active=1";
			$Maj = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($ProdSearch);
			if (is_array($Maj))foreach ($Maj as $M){
				//Calcul du checksum
				$file_string = file_get_contents($M["Fichier"]);
				$crc = crc32($file_string);
				$result.="
		<item id='".$M["Id"]."-MAJ' type='".$M["Type"]."' crc='".sprintf("%x",$crc)."'>
			<libelle>".$M["Nom"]."</libelle>
			<file>".$M["NomFichier"]."</file>
			<path>".$M["Path"]."</path>
		</item>";
			}
			$result.="
</xml>";
		}else{
			$result="ERREUR AUCUN CLIENT CORRESPONDANT";
		}
		return utf8_decode($result);
	}

	//GETFILE
	//TELECHARGEMENT DES FICHERS
	//$Id est le numero du produit
	//$Serial est le NUMERO DE SERIE
	function GetFile($Id,$Serial){
		if (!$Serial) return "ERREUR VEUILLEZ FOURNIR UN NUMERO DE SERIE VALIDE";
// 		if ($Id=="Test") {
// 			$file_string = file_get_contents('Home/87/Natom.exe');
// 			return chunk_split (base64_encode($file_string));
// 		}
// 		if ($Id=="Francais.lnn") {
// 			$file_string = file_get_contents('Home/87/Français.lnn');
// 			return chunk_split (base64_encode($file_string));
// 		}
		$GLOBALS["Systeme"]->Log->log("SOAP GETFILE $Id $Serial ");
		$GLOBALS["Systeme"]->Modules["Boutique"]->loadSchema();
		$Search = "Boutique/Client/NatomSerie=".$Serial;
		$Tab = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($Search,"",0,1);
// 		$result = print_r($Tab,true);
		if (is_array($Tab)){
			if (sizeof(explode("-L",$Id))>1){
				$Id = explode("-L",$Id);
				$Id = $Id[0];
				$GLOBALS["Systeme"]->Modules["Boutique"]->loadSchema();
				$Search = "Boutique/Produit/".$Id;
				$Tab = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($Search,"",0,1);
				$file_string = file_get_contents($Tab[0]["ImageCryptLegende"]);
				return chunk_split (base64_encode($file_string));
			}elseif (sizeof(explode("-MAJ",$Id))>1){
				$Id = explode("-MAJ",$Id);
				$Id = $Id[0];
				$GLOBALS["Systeme"]->Modules["Boutique"]->loadSchema();
				$Search = "Boutique/Natom/".$Id;
				$Tab = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($Search,"",0,1);
				$file_string = file_get_contents($Tab[0]["Fichier"]);
				return chunk_split (base64_encode($file_string));
			}elseif (sizeof(explode("-P",$Id))>1){
				$Id = explode("-P",$Id);
				$Id = $Id[0];
				$GLOBALS["Systeme"]->Modules["Boutique"]->loadSchema();
				$Search = "Boutique/Produit/".$Id."/Pack";
				$Tab = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($Search,"",0,1);
				$file_string = file_get_contents($Tab[0]["FichierXmn"]);
				return chunk_split (base64_encode($file_string));
			}else{
				$GLOBALS["Systeme"]->Modules["Boutique"]->loadSchema();
				$Search = "Boutique/Produit/".$Id;
				$Tab = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($Search,"",0,1);
				if ($Tab[0]["Type"]=="Pack"){
					$Search2 = "Boutique/Produit/".$Id."/Pack";
					$Tab2 = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($Search2,"",0,1);
					$file_string = file_get_contents($Tab2[0]["FichierXmn"]);
				}else{
					$file_string = file_get_contents($Tab[0]["ImageCrypt"]);
				}
				return chunk_split (base64_encode($file_string));
			}
		}else{
			return "VEUILLEZ UN NUMERO DE SERIE VALIDE";
		}
	}
	//GETPACK
	//TELECHARGEMENT DES PACKS
	//$A est le NUMERO DE SERIE
	function GetPack($Id,$A){
// 		$result = print_r($_SERVER,true);
		//Recherche du client.
		if (!$A) return "ERREUR VEUILLEZ FOURNIR UN NUMERO DE SERIE VALIDE";
		$GLOBALS["Systeme"]->Modules["Boutique"]->loadSchema();
		$Search = "Boutique/Client/NatomSerie=".$A;
		$Tab = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($Search,"",0,1);
// 		$result = print_r($Tab,true);
		if (is_array($Tab)){
			// Constrcution du Xml avec les fichiers
			$PackSearch = "Boutique/Produit/".$Id."/Pack";
			$Pack = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($PackSearch);
			//Calcul du checksum
			$file_string = file_get_contents($Pack[0]["FichierXmn"]);
			$crc = crc32($file_string);
			$result="<xml>";
			$fn = explode("/",$Pack[0]["FichierXmn"]);
			$fn = $fn[sizeof($fn)-1];
			$result.="
	<item id='".$Id."-P' type='0' crc='".sprintf("%x",$crc)."'>
		<libelle>".$Pack[0]["Nom"]."</libelle>
		<file>".$fn."</file>
		<path></path>
	</item>";
			$ProdSearch = "Boutique/Pack/".$Pack[0]["Id"]."/Produit";
			$Prod = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($ProdSearch);
			if (is_array($Prod))foreach ($Prod as $P){
				if ($P["ImageCrypt"]!=""){
				//Calcul du checksum
				$file_string = file_get_contents($P["ImageCrypt"]);
				$crc = crc32($file_string);
				//Nom du fichier
				$p = explode("/",$P["ImageCrypt"]);
				$fn = $p[sizeof($p)-1];
				$n = preg_replace("#(\-[0-9]+)\.#",".",$fn);
				$n = preg_replace("#\_#","-",$n);
				$result.="
	<item id='".$P["Id"]."' type='0' crc='".sprintf("%x",$crc)."'>
		<libelle>".$P["Libelle"]."</libelle>
		<file>".$n."</file>
		<path>".DEST_PATH_PLANCHE."</path>
	</item>";
				}
				if ($P["ImageCryptLegende"]!=""){
				//Calcul du checksum
				$file_string = file_get_contents($P["ImageCryptLegende"]);
				$crc = crc32($file_string);
				//Nom du fichier
				$p = explode("/",$P["ImageCryptLegende"]);
				$fn = $p[sizeof($p)-1];
				$n = preg_replace("#(\-[0-9]+)\.#",".",$fn);
				$n = preg_replace("#\_#","-",$n);
				$result.="
	<item id='".$P["Id"]."-L' type='0' crc='".sprintf("%x",$crc)."'>
		<libelle>".$P["Libelle"]."</libelle>
		<file>".$n."</file>
		<path>".DEST_PATH_PLANCHE."</path>
	</item>";	
				}
			}
			$result.="
</xml>";
		}else{
			$result="ERREUR AUCUN CLIENT CORRESPONDANT";
		}
		return utf8_decode($result);
	}
	function GetClient($Serial){
		$GLOBALS["Systeme"]->Log->log("SOAP GETCLIENT $Serial ");
		if (!$Serial) return "ERREUR VEUILLEZ FOURNIR UN NUMERO DE SERIE VALIDE";
		$GLOBALS["Systeme"]->Modules["Boutique"]->loadSchema();
		$Search = "Boutique/Client/NatomSerie=".$Serial;
		$Tab = $GLOBALS["Systeme"]->Modules["Boutique"]->callData($Search,"",0,1);
		$P = $Tab[0];
		if (is_array($Tab)){
			$Result="<xml>
	<nom>".$P["Nom"]."</nom>
	<prenom>".$P["Prenom"]."</prenom>
	<activite>".$P["Activite"]."</activite>
	<specialite>".$P["Specialite"]."</specialite>
	<adresse>".$P["Adresse"]."</adresse>
	<adresse2>".$P["Adresse2"]."</adresse2>
	<codepostal>".$P["CodPos"]."</codepostal>
	<ville>".$P["Ville"]."</ville>
	<pays>".$P["Pays"]."</pays>
	<mail>".$P["Mail"]."</mail>
	<telephone>".$P["Tel"]."</telephone>
</xml>";	
		}else{
			$Result="ERREUR AUCUN CLIENT CORRESPONDANT";
		}
		return $Result;
	}
}

?>